package br.com.site;

import java.util.ArrayList;
import java.util.List;

import model.Equipe;
import model.Estrutura;
import model.PDI;
import model.Perigo;
import model.Vitima;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

import com.google.android.maps.GeoPoint;

public class NovoPerigo extends Activity{

	private boolean outroTipo;
	
	private List<Equipe> listaEquipes;
	private List<Vitima> listaVitimas;
	
	private TableLayout tlPerDelete;
	private TableRow trPerigoTipo;
	
	private EditText etPerigoIdentificacao, etPerigoTipo;
	private Spinner spPerigoTipo, spPerigoRisco, spPerigoDevoIr, spPerigoTeam, spPerigoVitima;
	
	private ImageButton salvar;
	private TextView tvTit;
	
	ArrayAdapter<CharSequence> adtPerigoTipo, adtPerigoRisco, adtPerigoDevoIr, adtPerigoEquipe, adtPerigoVitima;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.novo_perigo);
		
		carregaViews();
    	
    	setPDIArrayAdapter(adtPerigoEquipe, spPerigoTeam, listaEquipes);
        setPDIArrayAdapter(adtPerigoVitima, spPerigoVitima, listaVitimas);
        
        outroTipo = false;
        
        if(!Global.editarPDI) novoPDI();
        else editarPDI();
        
	}
	
	private void carregaViews(){
		listaEquipes = br.com.site.MainActivity.listaEquipes;
		listaVitimas = br.com.site.MainActivity.listaVitimas;
		
		tlPerDelete = (TableLayout) findViewById(R.novo_perigo.tlPerDelete);
		tlPerDelete.setVisibility(View.GONE);
		
		trPerigoTipo = (TableRow) findViewById(R.novo_perigo.trPerigoTipo);
		
		etPerigoIdentificacao = (EditText) findViewById(R.novo_perigo.etPerigoIdentificacao);
		etPerigoTipo = (EditText) findViewById(R.novo_perigo.etPerigoTipoDePerigo);
		spPerigoTipo = (Spinner) findViewById(R.novo_perigo.spPerigoTipo);
		
		spPerigoRisco = (Spinner) findViewById(R.novo_perigo.spPerigoRiscoAssociado);
		spPerigoDevoIr = (Spinner) findViewById(R.novo_perigo.spPerigoDevoIr);
		spPerigoTeam = (Spinner) findViewById(R.novo_perigo.spPerigoTeam);
		spPerigoVitima = (Spinner) findViewById(R.novo_perigo.spPerigoVitima);
    	
    	salvar = (ImageButton) findViewById(R.novo_perigo.perigoSalvar);
    	tvTit = (TextView) findViewById(R.novo_perigo.tvPerTit);
    	
    	adtPerigoTipo = ArrayAdapter.createFromResource(this, R.array.perigoTipo_array, R.layout.textviewmodelo);
    	adtPerigoTipo.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spPerigoTipo.setAdapter(adtPerigoTipo);
    	
    	adtPerigoRisco = ArrayAdapter.createFromResource(this, R.array.perigoRisco_array, R.layout.textviewmodelo);
    	adtPerigoRisco.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spPerigoRisco.setAdapter(adtPerigoRisco);
        
        adtPerigoDevoIr = ArrayAdapter.createFromResource(this, R.array.perigoDevoIr_array, R.layout.textviewmodelo);
        adtPerigoDevoIr.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spPerigoDevoIr.setAdapter(adtPerigoDevoIr);
        
        adtPerigoEquipe = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
        adtPerigoEquipe.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
        adtPerigoVitima = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
        adtPerigoVitima.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
	}
	
	/**
	 * Este método aplicará a um spinner um ArrayAdapter populado pelos toStrings de cada PDI contido numa lista de PDIs
	 * @param aAdapter ArrayAdapter que será aplicado no Spinner
	 * @param sp Spinner que receberá os toStrings dos PDIs
	 * @param l Lista de PDIs a serem adicionados ao ArrayAdapter
	 */
	private void setPDIArrayAdapter(ArrayAdapter<CharSequence> aAdapter, Spinner sp, List<?> l){
		aAdapter = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
		aAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
		sp.setAdapter(aAdapter);
        if(l.size() < 1){
        	aAdapter.add("Desconhecido");
        }else{
        	aAdapter.add("Desconhecido");
	        for (int j = 0; j < l.size(); j++) {
	        	aAdapter.add(l.get(j).toString());
			}
    	}
	}
	
	private void novoPDI(){
		spPerigoTipo.setOnItemSelectedListener(new OnItemSelectedListener() {
			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1,
					int arg2, long arg3) {
				if (arg0.getSelectedItem().toString() == "Outro..."){
					trPerigoTipo.setVisibility(View.VISIBLE);
					outroTipo = true;
				}else{
					trPerigoTipo.setVisibility(View.GONE);
					outroTipo = false;
				}
				
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {
				
			}
			
		});        	
    	
    	salvar.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				salvar.setImageResource(R.drawable.bt_aplicar);
				GeoPoint temp = new GeoPoint(0, 0);
				String identif = etPerigoIdentificacao.getText().toString();
				String tipoPerigo = "Desconhecido";
				String textoBalao = "";
				
				if(!spPerigoTipo.getSelectedItem().equals("Desconhecido") && !outroTipo){
            		tipoPerigo = spPerigoTipo.getSelectedItem().toString();
            		textoBalao += tipoPerigo + ", ";
            	}
				
				if(outroTipo){
					tipoPerigo = etPerigoTipo.getText().toString();
            		textoBalao += tipoPerigo + ", ";
				}
				
				int riscoAssociado = 5;
				if (spPerigoRisco.getSelectedItem().equals("Desconhecido")){
					riscoAssociado = 0;
					textoBalao += "Risco desconhecido";
				}else if (spPerigoRisco.getSelectedItem().equals("Nulo")){
					riscoAssociado = 1;
					textoBalao += "Risco nulo";
				}else if (spPerigoRisco.getSelectedItem().equals("Baixo")){
					riscoAssociado = 2;
					textoBalao += "Risco baixo";
				}else if (spPerigoRisco.getSelectedItem().equals("Médio")){
					riscoAssociado = 3;
					textoBalao += "Risco médio";
				}else if (spPerigoRisco.getSelectedItem().equals("Alto")){
					riscoAssociado = 4;
					textoBalao += "Risco alto";
				}else{
					riscoAssociado = 5;
				}
				
				String devoIr = "Desconhecido";
				if (spPerigoDevoIr.getSelectedItem().equals("Sim")){
					devoIr = "Sim";
				}else if (spPerigoDevoIr.getSelectedItem().equals("Não")){
					devoIr = "Não";
				}
				
				Equipe perigoTeam = null;
				for (Equipe e : listaEquipes) {
					if (spPerigoTeam.getSelectedItem().equals(e.toString())){
						perigoTeam = e;
					}else{
						continue;
					}
				}
				
				Vitima perigoVit = null;
				for (Vitima vi : listaVitimas) {
					if (spPerigoVitima.getSelectedItem().equals(vi.toString())){
						perigoVit = vi;
					}else{
						continue;
					}
				}
				
				if (perigoTeam != null) textoBalao += "\nEquipe: " + perigoTeam.toString();
				if (perigoVit != null) textoBalao += "\nVítima: " + perigoVit.toString();
				
				Perigo per = new Perigo(temp,
						identif, textoBalao,
						perigoTeam, perigoVit,
						tipoPerigo, riscoAssociado, devoIr, identif);
				
				if(perigoTeam != null) perigoTeam.setPerigo(per);
				if(perigoVit != null) perigoVit.setPerigo(per);
				
				br.com.site.MainActivity.objetoPassado = per;
				Global.novoPdi = true;
				finish();
				br.com.site.MainActivity.exibeToast(getApplicationContext(), "Toque na tela para posicionar o perigo.");
			}
		});
	}
	
	private void editarPDI(){
		salvar.setImageResource(R.drawable.bt_edit);
    	tvTit.setText("Editar Perigo");
    	tlPerDelete.setVisibility(View.VISIBLE);
    	
    	final TextView tvDel = (TextView) findViewById(R.novo_perigo.tvDelPer);
    	final ImageView ivDel = (ImageView) findViewById(R.novo_perigo.ivDelPer);
    	
    	final Perigo p = (Perigo) Global.pdiEdicao;
    	
    	tvDel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				deletaObj(p);
			}
		});
    	
    	ivDel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				deletaObj(p);
			}
		});
    	
    	spPerigoTipo.setOnItemSelectedListener(new OnItemSelectedListener() {
			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1,
					int arg2, long arg3) {
				if (arg0.getSelectedItem().toString().equals("Outro...")){
					trPerigoTipo.setVisibility(View.VISIBLE);
					etPerigoTipo.setText(p.getTipoDePerigo());
					outroTipo = true;
				}else{
					trPerigoTipo.setVisibility(View.GONE);
					outroTipo = false;
				}
				
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {
				
			}
			
		});        	
    	
    	etPerigoIdentificacao.setText(p.getIdentificacao());
    	
    	int c = Global.strPer.length;
    	for (String s : Global.strPer) {
			if(p.getTipoDePerigo() != "Desconhecido" && !p.getTipoDePerigo().equals(s)){
				c--;
			}
		}
    	if (c == 0){
    		setAdapterPositionFromString(spPerigoTipo,"Outro...");
    	}else{
    		setAdapterPositionFromString(spPerigoTipo,p.getTipoDePerigo());
    	}
    	
    	setAdapterPositionFromString(spPerigoRisco,p.getRiscoAssociado());
    	setAdapterPositionFromString(spPerigoDevoIr,p.getDevoIr());
    	
    	
    	try{
    		setAdapterPositionFromString(spPerigoTeam,p.getEquipe().toString());
    	}catch (NullPointerException e) {
    		setAdapterPositionFromString(spPerigoTeam, "Desconhecido");
		}try{
    		setAdapterPositionFromString(spPerigoVitima,p.getVitima().toString());
    	}catch (NullPointerException e) {
    		setAdapterPositionFromString(spPerigoVitima, "Desconhecido");
		}
    	
    	salvar.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				MainActivity.listaPerigos.remove(p);
				
				p.setIdentificacao(getStringEditText(etPerigoIdentificacao));
				
				String tipoPerigo = "Desconhecido";
				
				
				String textoBalao = "";
				
				if(!spPerigoTipo.getSelectedItem().equals("Desconhecido") && !outroTipo){
            		tipoPerigo = spPerigoTipo.getSelectedItem().toString();
            		textoBalao += tipoPerigo + ", ";
            	}
				
				if(outroTipo){
					tipoPerigo = etPerigoTipo.getText().toString();
            		textoBalao += tipoPerigo + ", ";
				}
				
				p.setTipoDePerigo(tipoPerigo);
				
				int riscoAssociado = 5;
				if (spPerigoRisco.getSelectedItem().equals("Desconhecido")){
					riscoAssociado = 0;
					textoBalao += "Risco desconhecido";
				}else if (spPerigoRisco.getSelectedItem().equals("Nulo")){
					riscoAssociado = 1;
					textoBalao += "Risco nulo";
				}else if (spPerigoRisco.getSelectedItem().equals("Baixo")){
					riscoAssociado = 2;
					textoBalao += "Risco baixo";
				}else if (spPerigoRisco.getSelectedItem().equals("Médio")){
					riscoAssociado = 3;
					textoBalao += "Risco médio";
				}else if (spPerigoRisco.getSelectedItem().equals("Alto")){
					riscoAssociado = 4;
					textoBalao += "Risco alto";
				}else{
					riscoAssociado = 5;
				}
				
				p.setRiscoAssociado(riscoAssociado);
				
				String devoIr = "Desconhecido";
				if (spPerigoDevoIr.getSelectedItem().equals("Sim")){
					devoIr = "Sim";
				}else if (spPerigoDevoIr.getSelectedItem().equals("Não")){
					devoIr = "Não";
				}
				p.setDevoIr(devoIr);
				
				Equipe perigoTeam = null;
				for (Equipe e : listaEquipes) {
					if (spPerigoTeam.getSelectedItem().equals(e.toString())){
						perigoTeam = e;
					}else{
						continue;
					}
				}
				
				Vitima perigoVit = null;
				for (Vitima vi : listaVitimas) {
					if (spPerigoVitima.getSelectedItem().equals(vi.toString())){
						perigoVit = vi;
					}else{
						continue;
					}
				}
				
				if (perigoTeam != null){
					textoBalao += "\nEquipe: " + perigoTeam.toString();
					p.setEquipe(perigoTeam);
				}
				if (perigoVit != null){
					textoBalao += "\nVítima: " + perigoVit.toString();
					p.setVitima(perigoVit);
				}
				
				p.setTextoBalao(textoBalao);
				
				try{
					perigoTeam.setPerigo(p);
				}catch(NullPointerException exc){
					//TODO o que fazer se o user cadastra um equipamento e descadastra?
				}
				try{
					perigoVit.setPerigo(p);
				}catch(NullPointerException exc){
					//TODO o que fazer se o user cadastra um equipamento e descadastra?
				}
				
				atualizaObj(p);
            	finish();
    			Global.editarPDI=false;
    			MainActivity.exibeToast(getApplicationContext(), "Dados atualizados");
			}
		});
	}
	
	public void setAdapterPositionFromString(Spinner spinner, String texto){
		@SuppressWarnings({ "unchecked", "rawtypes" })
		ArrayAdapter<CharSequence> adapter = (ArrayAdapter) spinner.getAdapter();
		try{
			int pos = adapter.getPosition(texto);
			spinner.setSelection(pos);
		}catch(NullPointerException exc){
			spinner.setSelection(0);
		}
	}
	
	public static void atualizaObj(Perigo per){
		MainActivity.perigoOverlays.clear();
		for (Perigo p : MainActivity.listaPerigos) {
			if(!p.equals(per)){
				MainActivity.perigoOverlays.addOverlay(p.getOverlayItem(), p);
			}
		}
		MainActivity.perigoOverlays.addOverlay(per.getOverlayItem(), per);
		MainActivity.listaPerigos.add(per);
		MainActivity.perigoOverlays.hideBalloon();
	}
	
	public void deletaObj(final Perigo p){
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Excluir Perigo")
			   .setMessage("Tem certeza?")
		       .setCancelable(false)
		       .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		        	   ArrayList<PDI> links = Global.getArrayDeLinks(p);
		        	   if(!links.equals(null) && links.size()>0){
		        		   for (PDI pdi : links) {
		        			   if(pdi instanceof Estrutura){
		        				   Estrutura es = (Estrutura) pdi;
		        				   es.setPerigo(null);
		        				   es.atualizaTextoBalao();
		        				   NovoEstrutura.atualizaObj(es);
		        			   }
		        			   if(pdi instanceof Equipe){
		        				   Equipe e = (Equipe) pdi;
		        				   e.setPerigo(null);
		        				   e.atualizaTextoBalao();
		        				   NovoEquipe.atualizaObj(e);
		        			   }
		        			   if(pdi instanceof Vitima){
		        				   Vitima vi = (Vitima) pdi;
		        				   vi.setPerigo(null);
		        				   vi.atualizaTextoBalao();
		        				   NovoVitima.atualizaObj(vi);
		        			   }
		        		   }
		        	   }		        	   
		        	   
		        	   MainActivity.perigoOverlays.clear();
		        	   MainActivity.listaPerigos.remove(p);
		        	   for (Perigo pe : MainActivity.listaPerigos) {
		        		   MainActivity.perigoOverlays.addOverlay(pe.getOverlayItem(), pe);
		        	   }
		        	   MainActivity.perigoOverlays.hideBalloon();
		        	   finish();
		        	   Global.editarPDI=false;
		           }
		       })
		       .setNegativeButton("Não", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		                dialog.cancel();
		           }
		       });
		builder.show();
	}
	
	public String getStringEditText(EditText et){
		if (et.getText().toString().equals("")) return "Desconhecido";
		return et.getText().toString();
	}

	@Override
	public void onBackPressed() {
		Global.editarPDI=false;
		super.onBackPressed();
	}

}
